package com.bitoon.basketdudes.web.xhr;

import com.bitoon.basketdudes.web.BaseAction;
import com.bitoon.basketdudes.web.commons.RankingCommon;
import com.bitoon.basketdudes.web.datos.*;
import com.opensymphony.xwork2.*;
import java.util.*;
import javax.persistence.*;

import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;

public class Ranking extends BaseAction {

    private List<DatosRanking> ranking;
    private InfoCabeceraXHR cabecera;
    private int pagina = 0;
    private int cuantos;

    // Parámetros de filtrado
    private int inicio = 1;
    private int resultados = -1; // No hay resultados, si se pasa 0 son Todos
    private String ambito = ""; // País (ES, IT, FR, etc.)
    private String cadena = "";
    private String donde = "";

    private Logger log = Logger.getLogger(Ranking.class);

    public String execute() {
        try {
            RankingCommon rc = new RankingCommon();
            ArrayList<DatosRanking> rankingGlobal = new ArrayList<DatosRanking>();
            int offset = 0;
            int posiciones = 0;

            cabecera = new InfoCabeceraXHR();

            if (pagina == 0) { // No se llama por AJAX
                pagina = 1;
                if (resultados < 0) {
                    resultados = LISTADO_RANKING_POSICIONES_FILA;
                }
                session.put("bd_ranking_resultados", resultados);
            } else { // Llamada por AJAX
                Integer sResultados = (Integer)session.get("bd_ranking_resultados");
                if (sResultados != null) {
                    resultados = sResultados;
                } else {
                    resultados = LISTADO_RANKING_POSICIONES_FILA;
                }
            }

            if (inicio > 1) {
                pagina = ((inicio-1)/resultados) + 1;
            }

            if (donde.equals("")) {
                posiciones = rc.totalPosicionesGlobal();
            } else {
                posiciones = rc.totalPosicionesFiltrado(donde, cadena);
            }

            if (resultados > 0) {
                cuantos = (int)((posiciones-1)/resultados)+1;
            } else {
                cuantos = 1;
            }

            if (pagina > cuantos) {
                pagina = cuantos;
            }

            offset = (pagina-1) * resultados;

            List<DatosRanking> temporal = null;

            log.debug("donde: " + donde);

            if (donde.equals("")) {
                temporal = rc.listadoRankingGlobal(offset, resultados);
            } else {
                temporal = rc.listadoRankingGlobalFiltrado(donde, cadena, offset, resultados);
            }

            if (temporal != null) {

                Iterator iter = temporal.iterator();
                while (iter.hasNext()) {
                    DatosRanking item = (DatosRanking)iter.next();
                    log.debug("equipo: " + item.getEquipo());
                    rankingGlobal.add(item);
                }
                setRanking(rankingGlobal);
            }
            
            cabecera.setCorrecto(1);
            cabecera.setActual(pagina);
            cabecera.setTotal(cuantos);
            cabecera.setElementos(resultados);
            cabecera.setElementoInicial(offset+1);
            int elementoFinal = offset + resultados;
            if (elementoFinal > posiciones) {
                elementoFinal = posiciones;
            }
            cabecera.setElementoFinal(elementoFinal);

            int p1=0, p2=0;

            if (pagina <= (LISTADO_RANKING_HUECOS_LADO_PAGINA+1)) {
                p1 = 1;
                p2 = LISTADO_RANKING_HUECOS_LADO_PAGINA*2 + 1;
            } else if (pagina >= (cuantos-LISTADO_RANKING_HUECOS_LADO_PAGINA)) {
                p1 = cuantos - (LISTADO_RANKING_HUECOS_LADO_PAGINA*2);
                p2 = cuantos;
            } else {
                p1 = pagina - LISTADO_RANKING_HUECOS_LADO_PAGINA;
                p2 = pagina + LISTADO_RANKING_HUECOS_LADO_PAGINA;
            }
            cabecera.setPrimeraPagina(p1);
            cabecera.setUltimaPagina(p2);

            // Crear el HTML de la paginacion
            //paginacion = rc.damePaginacion(pagina, LISTADO_RANKING_HUECOS_LADO_PAGINA, p1, cuantos);
            //setPaginacion(paginacion);

            setCabecera(cabecera);

            ServletActionContext.getRequest().setAttribute("ranking", ranking);
            ServletActionContext.getRequest().setAttribute("cabecera", cabecera);

        } catch (Exception e) {
            log.error("Error: " , e);
            cabecera.setCorrecto(0);
            setCabecera(cabecera);
        }

        return SUCCESS;
    }

    public List<DatosRankingPais> getListaRankingPaises() {
        List<DatosRankingPais> retorno = null;
        EntityManager em = null;

        try {
            em = emfBasket.createEntityManager(); // checked
            Query q = em.createNativeQuery("select "
                    + "p.nombre as pais, count(*) as numUsuarios, "
                    + "avg(rp.posicion) as posicionMedia "
                    + "from rankings.ranking_pais rp, central.pais p "
                    + "where p.id = rp.pais_id "
                    + "group by p.nombre limit 5", DatosRankingPais.class);
            retorno = (List<DatosRankingPais>)q.getResultList();
        } catch (Exception e) {
            log.error("Error: " , e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }


    public List<DatosRanking> getRanking() {
        return ranking;
    }

    public void setRanking(List<DatosRanking> ranking) {
        this.ranking = ranking;
    }

    public void setPagina(int pagina) {
        this.pagina = pagina;
    }

    public InfoCabeceraXHR getCabecera() {
        return cabecera;
    }

    public void setCabecera(InfoCabeceraXHR cabecera) {
        this.cabecera = cabecera;
    }

    public int getInicio() {
        return inicio;
    }

    public void setInicio(int inicio) {
        this.inicio = inicio;
    }

    public int getResultados() {
        return resultados;
    }

    public void setResultados(int resultados) {
        this.resultados = resultados;
    }

    public String getAmbito() {
        return ambito;
    }

    public void setAmbito(String ambito) {
        this.ambito = ambito;
    }

    public String getCadena() {
        return cadena;
    }

    public void setCadena(String cadena) {
        this.cadena = cadena;
    }

    public String getDonde() {
        return donde;
    }

    public void setDonde(String donde) {
        this.donde = donde;
    }

}
